package com.monster.utils;

import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * 时间工具类
 * @author kuang
 */
public class TimeUtils {
    /**
     * 存放格式化对象
     */
    private static final Map<String, DateTimeFormatter> formatters = new HashMap<>(10);
    /**
     * 默认的一些时间格式
     */
    public static final String yyyyMMddHHmmssSSS = "yyyyMMddHHmmssSSS";
    public static final String yyyyMMddHH = "yyyyMMddHH";
    public static final String yyyyMMdd = "yyyyMMdd";
    public static final String yyyyMM = "yyyyMM";
    public static final String yyyy = "yyyy";

    /**
     * 初始化时间格式实例
     */
    static {
        formatters.put(yyyyMMddHHmmssSSS, DateTimeFormatter.ofPattern(yyyyMMddHHmmssSSS).withZone(ZoneId.systemDefault()));
        formatters.put(yyyyMMddHH, DateTimeFormatter.ofPattern(yyyyMMddHH).withZone(ZoneId.systemDefault()));
        formatters.put(yyyyMMdd, DateTimeFormatter.ofPattern(yyyyMMdd).withZone(ZoneId.systemDefault()));
        formatters.put(yyyyMM, DateTimeFormatter.ofPattern(yyyyMM).withZone(ZoneId.systemDefault()));
        formatters.put(yyyy, DateTimeFormatter.ofPattern(yyyy).withZone(ZoneId.systemDefault()));
    }

    /**
     * 获取一个格式化的实例
     * @param format 格式化的格式
     * @return 格式化实例
     */
    public static DateTimeFormatter getFormatter (String format) {
        if (formatters.containsKey(format)) {
            return formatters.get(format);
        }
        synchronized (format) {
            formatters.put(format, DateTimeFormatter.ofPattern(format).withZone(ZoneId.systemDefault()));
        }
        return formatters.get(format);
    }

    /**
     * 根据格式 格式化当前时间
     * @param format 格式
     * @return 格式化后的时间
     */
    public static String format (String format) {
        return getFormatter(format).format(new Date().toInstant());
    }

    /**
     * 进行时间计算并获取相关格式
     * @param date 需要计算的时间
     * @param format 需要的格式
     * @param time 需要计算的时间数值
     * @param field 计算的单位 Calendar.YEAR
     * @return 格式化后的数据
     */
    public static String format (Date date, String format, Integer time, int field) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(field, time);
        return getFormatter(format).format(calendar.getTime().toInstant());

    }
}
